package jfae.core.properties.parsers.annotation;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;

import jfae.core.properties.FieldInfo;
import jfae.core.properties.parsers.execution.constraints.ExecuteFirst;

// TODO: inserire un sistema di constraints per l'ordine di 
// esecuzione degli annotation handlers
@ExecuteFirst //potrebbe essere una delle constraints
public class ColumnHandler implements AnnotationHandler<Column> {
	
	private final Set<Class<?>> allowed;

	public ColumnHandler(){
		allowed = new HashSet<Class<?>>();
		Class<?>[] classes = new Class<?>[]{
				String.class, Short.class, Integer.class, 
				Long.class, Float.class, Double.class};
		allowed.addAll(Arrays.asList(classes));
	}
	
	@Override
	public void handle(Column column, FieldInfo<?> info) {
		if(allowed.contains(info.getType())){
			int length = column.length();
			if(length > 0){
				info.setFieldLength(length);
			}
		}
		
		// TODO: testare attentamente cmq inserire
		// un sistema di constraints per l'ordine di 
		// esecuzione degli annotation handlers
		// questo per esempio, deve essere eseguito
		// per primo per evitare di interferire
		// con le impostazioni di Presentation
		// NotNull ed eventuali altre annotations
		// coinvolte nella validazione della property
		boolean nullable = column.nullable();
		info.setRequired(!nullable);
		
		// TODO: valutare la gestione della precisione per i numeri con virgola
		// si potrebbe tradurre in un format
		// per esempio se precision fosse 2
		// allora si potrebbe applicare il
		// format #0.00
//		int precision = column.precision();
		
	}
	

	@Override
	public Class<Column> getType() {
		return Column.class;
	}

}
